package com.yifeng.repo.controller.excel.loader.biz;

import com.yifeng.repo.controller.excel.configure.ExcelLoaderProperties;
import com.yifeng.repo.controller.excel.loader.dto.DataTaskConf;
import com.yifeng.repo.controller.excel.loader.dto.DataTaskDto;
import org.apache.poi.ss.usermodel.*;

/**
 * Created by daibing on 2023/4/1.
 */
public interface BizBaseAction {

    /**
     * 支持任务自定义配置：默认是应用级别配置。特别注意 importLogBaseHeader 是固定3个字段，仅支持修改中文名称
     */
    default DataTaskConf getTaskConf(ExcelLoaderProperties properties) {
        return new DataTaskConf(
                properties.getBatchSize(),
                properties.getQueueSize(),
                properties.getImportExcelDownTaskNumber(),
                properties.getImportLogBaseHeader(),
                properties.isImportLogFileSplit()
        );
    }

    /**
     * 通用单元格样式，注意仅调度一次
     */
    default CellStyle commonCellStyle(Cell cell) {
        Workbook wb = cell.getSheet().getWorkbook();
        CellStyle cellStyle = wb.createCellStyle();

        // 左对齐，垂直居中对齐
        cellStyle.setAlignment(HorizontalAlignment.LEFT);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        // 边框线
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderTop(BorderStyle.THIN);

        // 自动换行
        cellStyle.setWrapText(true);
        return cellStyle;
    }

    /**
     * 具体单元格样式，如果每列设置不同样式注意定义CellStyle不能超过64000，业务自己管理CellStyle
     */
    default CellStyle cellStyle(Cell cell) {
        return null;
    }

    /**
     * 设置列宽度
     */
    default int columnWidth(Cell cell) {
        return 5000;
    }

    /**
     * 动作读完成（导入就是读excel完成，导出就是读业务库完成）
     */
    default void readFinished(DataTaskDto dataTaskDto) {
        // default nothing.
    }

    /**
     * 动作写完成（导入就是写业务库完成，导出就是写excel完成）
     */
    default void writeFinished(DataTaskDto dataTaskDto) {
        // default nothing.
    }

    /**
     * 动作整体完成
     */
    default void totalFinished(DataTaskDto dataTaskDto) {
        // default nothing.
    }

    /**
     * 动作失败退出
     */
    default void failed(DataTaskDto dataTaskDto) {
        // default nothing.
    }
}
